package log;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class Stringsplit {
	private static void readAndWriteFile(File sourceFile, File destFile) throws IOException{
		BufferedReader reader = new BufferedReader(new FileReader(sourceFile));
		BufferedWriter writer = new BufferedWriter(new FileWriter(destFile));
		String line = null;
		try{
			while((line=reader.readLine()) != null){
				List<String> list = jiexi(line);//解析一行记录，用空格分割。
				String newRecord = getNewRecord(list);
				writer.write(newRecord);
				writer.newLine();//输出换行符。如果没有这行，所有的记录都输出在一行了。
			}
		}finally{
			if(reader != null){
				reader.close();
			}
			if(writer != null){
				writer.close();
			}
		}
		
	}
	private static String getNewRecord(List<String> list) {
		formatDateTime(list);
		moveProgramToEnd(list);
		return convertListToString(list);
	}
	/**
	 * 把list中的GET请求中的/program移动到请求的末尾
	 * @param list
	 */
	private static void moveProgramToEnd(List<String> list) {
		String getString = list.get(5);
		String temp= getString.replace("/program", "");
		String result = temp.substring(0, temp.lastIndexOf("\""))+"/program\"";
		list.set(5, result);
	}
	/**
	 * 把list中的日期时间格式化
	 * @param list
	 */
	private static void formatDateTime(List<String> list) {
		SimpleDateFormat sourceFormat = new SimpleDateFormat("[dd/MMM/yyyy:HH:mm:ss Z]",Locale.US);
		SimpleDateFormat targetFormat = new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss Z]",Locale.CHINA);
		Date date = null;
		
		try {
			date = sourceFormat.parse(list.get(4));//list中的第五个元素(下标为4)是日期时间
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		if(date != null){
			String targetDateStr = targetFormat.format(date);
			list.set(4, targetDateStr);
		}
	}
	
	/**
	 * 把list用逗号拼接成字符串
	 * @param list
	 * @return
	 */
	private static String convertListToString(List<String> list) {
		StringBuilder builder = new StringBuilder();
		for(int i=0;i<list.size();i++){
			builder.append(list.get(i)).append(",");
		}
		if(builder.length()>0){
			builder.deleteCharAt(builder.length()-1);//去掉最后多余的逗号
		}
		return builder.toString();
	}
	
	/**
	 * 打印一条记录到控制台看看，没什么意义。
	 * @param list
	 */
//	private static void print(List<String> list) {
//		for (String ss : list) {
//			System.out.print(ss+"	");
//		}
//		System.out.println();
//	}
	
	private static List<String> jiexi(String line) {
		List<String> list = new ArrayList<String>();
		// 在引号或括号范围内的分隔符（在这里是空格）当做普通字符，不要用来拆分字符串
		boolean isQuotesFlag = false;// 是否进入引号""范围
		boolean isBracketFlag = false;// 是否进入括号[]范围

		StringBuilder temp = new StringBuilder();
		for (char ch : line.toCharArray()) {
			if ('"' == ch) {
				isQuotesFlag = !isQuotesFlag;
				temp.append(ch);//如果不想要"了，可以去掉这行。
			} else if ('[' == ch) {
				isBracketFlag = true;
				temp.append(ch);//如果不想要[了，可以去掉这行。
			} else if (']' == ch) {
				isBracketFlag = false;
				temp.append(ch);//如果不想要]了，可以去掉这行。
			} else if (' ' != ch) {
				temp.append(ch);
			} else {
				if (isQuotesFlag || isBracketFlag) {
					temp.append(ch);
				} else {
					list.add(temp.toString());
					temp = new StringBuilder();
				}
			}
		}
		// 添加结尾的字符
		list.add(temp.toString());
		return list;
	}
	public static void main(String args[]) throws IOException {
		File sourceFile = new File("C:/Users/sunniwell/Desktop/nginx_access.log");
		File destFile = new File("C:/Users/sunniwell/Desktop/nginx_access22.log");
		readAndWriteFile(sourceFile, destFile);
	}
}